package com.youlu.campus.web.ca.controller;

import com.youlu.campus.entity.UserCaInfo;
import com.youlu.campus.entity.VO.req.ReceiveCaVO;
import com.youlu.campus.entity.VO.req.UserCaInfoQueryVO;
import com.youlu.campus.web.common.base.RequestContext;
import com.youlu.campus.web.ca.service.UserCaInfoService;
import com.youlu.campus.web.common.utils.CommonUtils;
import com.yuelin.infrastructure.quantum.common.QResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
 * 用户证书控制器
 * 处理用户证书的查询、领取、下单及支付回调等相关操作
 */
@RestController
public class CaInfoController {
    @Autowired
    private UserCaInfoService userCaInfoService;

    /**
     * 查询我的证书列表
     * 获取当前用户名下的所有证书信息，支持分页和筛选
     * @param req 证书查询请求参数，包含分页信息等
     * @return 证书列表数据
     */
    @PostMapping("/mini-app/user/ca-info")
    public QResult getUserCaInfo(@RequestBody UserCaInfoQueryVO req) {
        req.setUserId(RequestContext.getUserId());
        return QResult.success(userCaInfoService.list(req));
    }

    /**
     * 领取证书
     * 处理用户的证书领取操作，可能涉及资格验证等逻辑
     * @param req 证书领取请求参数，包含证书相关信息
     * @return 领取结果
     */
    @PostMapping("/mini-app/user/ca/receive")
    public QResult receiveCertificate(@RequestBody ReceiveCaVO req) {
        return QResult.success(userCaInfoService.receiveCa(req));
    }

    /**
     * 查询证书详情
     * 获取指定证书的详细信息，包含证书内容、状态等
     * @param id 证书ID
     * @return 证书详情数据
     */
    @GetMapping("/mini-app/user/ca-info/detail")
    public QResult getCaDetail(@RequestParam("id") String id) {
        return QResult.success(userCaInfoService.getCaDetail(id, RequestContext.getUserId()));
    }

    /**
     * 证书下单
     * 为证书生成订单并发起支付流程
     * @param req 证书订单信息，包含证书ID等
     * @param httpRequest HTTP请求对象，用于获取客户端IP
     * @return 订单信息及支付参数
     */
    @PostMapping("/mini-app/user/ca-info/place-order")
    public QResult placeOrder(@RequestBody UserCaInfo req, HttpServletRequest httpRequest) {
        req.setClientIp(CommonUtils.getRemoteIp(httpRequest));
        req.setUserId(RequestContext.getUserId());
        req.setPlatform(RequestContext.getCurPlatform());
        req.setPayFeeType("1");
        return QResult.success(userCaInfoService.placeOrder(req));
    }

    /**
     * 证书支付回调
     * 处理支付完成后的回调通知，更新订单状态
     * @param orderNo 订单编号
     * @param httpRequest HTTP请求对象
     * @return 回调处理结果
     */
    @GetMapping("/mini-app/user/ca-info/place-order/call-back")
    public QResult placeOrder(@RequestParam("orderNo") String orderNo, HttpServletRequest httpRequest) {
        return QResult.success(userCaInfoService.payCallBack(RequestContext.getUserId(), orderNo));
    }
}